//==========================================================
// Logger.h
//
// Définition de la classe Logger
//
//==========================================================

#ifndef LOGGER_H
#define LOGGER_H

//==========================================================
// En-têtes
//==========================================================
#include <sstream>
#include <string>
#include <map>

namespace Tools
{
    //==========================================================
    // Classe de base abstraite pour les loggers
    //==========================================================
    class ILogger
    {
    public :

        //----------------------------------------------------------
        // Destructeur
        //----------------------------------------------------------
        virtual ~ILogger();

        //----------------------------------------------------------
        // Récupère l'instance du logger nommé 
        // Lance une Assertion si il n'existe pas
        //----------------------------------------------------------
        static ILogger * GetLogger(std::string name);

		//----------------------------------------------------------
        // Ajoute un logger
        //----------------------------------------------------------
        static void AddLogger( ILogger * logger );
        
        //----------------------------------------------------------
        // Supprime tous les loggers
        //----------------------------------------------------------
        static void DeleteLoggers();
        
        //----------------------------------------------------------
        // Log un message (façon C) suivant son degré d'importance
        //  - Warning : log des message à important
        //  - Info    : log des message à informatif
        //  - Severe  : log des message à caractère crucial
        //----------------------------------------------------------
        void Warning(const char* Format, ...);
        void Info(const char* Format, ...);
        void Severe(const char* Format, ...);
        
        //----------------------------------------------------------
        // Retourne le nom du logger
        //----------------------------------------------------------
        std::string GetName();

    protected :

		//----------------------------------------------------------
        // Constructeur
        //----------------------------------------------------------
        ILogger(std::string name);
        
        //----------------------------------------------------------
        // Renvoie la date courante
        //----------------------------------------------------------
        std::string CurrentDate() const;

        //----------------------------------------------------------
        // Renvoie l'heure courante
        //----------------------------------------------------------
        std::string CurrentTime() const;

    private :

	//----------------------------------------------------------
	// Définition de type
	//----------------------------------------------------------				
	typedef std::map<std::string,Tools::ILogger*> TLoggerMap;
		
        //----------------------------------------------------------
        // Inscrit un message - à surdéfinir dans les classes dérivées
        //----------------------------------------------------------
        virtual void Write(const std::string& Message) = 0;

        //----------------------------------------------------------
        // Détruit l'instance du logger
        //----------------------------------------------------------
        static void Destroy();

        //----------------------------------------------------------
        // Données membres
        //----------------------------------------------------------        
        static TLoggerMap loggerMap; // table de correspondance entre les nom et les loggers
        std::string loggerName; 
    };

} // namespace Tools


#endif // LOGGER_H
